package com.woniu.common.utils.token;

import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.woniu.common.constant.UserConstants;
import com.woniu.common.enums.ExceptionCode;
import com.woniu.common.exception.CustomException;
import io.jsonwebtoken.*;

import java.util.Date;
import java.util.HashMap;
import java.util.Map;

/**
 * @author 杨光
 * @date 2021年08月12日 15:31
 */
public class JwtTokenUtils {

    //生成jwttoken
    private static String generateJwtToken(Long userId,String userName,String userAccount,String securityKey){
        AccToken accToken = new AccToken(userId, userName, userAccount);
        //超时时间设置2小时
        accToken.setExpireDateTime(new Date((new Date()).getTime()+3600*24*300*1000));//超时时间设置为7天
        ObjectMapper mapper = new ObjectMapper();
        String ac = null;
        try {
            ac = mapper.writeValueAsString(accToken);
        } catch (JsonProcessingException e) {
            e.printStackTrace();
            throw new CustomException(ExceptionCode.JSON_CONVERTION_EXCEPTION);
        }

        Map<String,Object> claims = new HashMap<>();
        claims.put(UserConstants.JWT_CLAIMS_KEY,ac);

        JwtBuilder builder = Jwts.builder();
        //使用对称加密生成jwt token
        builder.setClaims(claims).signWith(SignatureAlgorithm.HS512,securityKey);
        String jwtToken = builder.compact();

        return jwtToken;
    }

    //解析jwtToken，如果解析失败，返回的AccToken是null，否则不为null
    private static AccToken parseToken(String jwtToken,String securityKey){
        AccToken accToken = null;
        try {
            JwtParser parser = Jwts.parser();
            //如果解析失败，会抛出异常
            Jws<Claims> claimsJws = parser.setSigningKey(securityKey).parseClaimsJws(jwtToken);
            Claims claims = claimsJws.getBody();
            String acJson = (String)claims.get(UserConstants.JWT_CLAIMS_KEY);
            ObjectMapper mapper = new ObjectMapper();
            accToken = mapper.readValue(acJson, AccToken.class);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return accToken;

    }
    //给管理员解析jwt的方法
    public static AccToken parseAdminJwtToken(String jwtToken){
        return parseToken(jwtToken,UserConstants.JWT_SECRET_KEY);
    }

    //给web用户解析jwt的方法
    public static AccToken parseWebJwtToken(String jwtToken){
        return parseToken(jwtToken,UserConstants.WEB_JWT_SECRET_KEY);
    }
    //给管理员登录加密的生成jwt的方法
    public static String generateAdminJwtToken(Long userId, String userName, String userAccount) {
        return generateJwtToken(userId,userName,userAccount,UserConstants.JWT_SECRET_KEY);
    }
    //给web用户登录加密的生成jwt的方法
    public static String generateWebJwtToken(Long userId, String userName, String userAccount) {
        return generateJwtToken(userId,userName,userAccount,UserConstants.WEB_JWT_SECRET_KEY);
    }
}
